<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>硬件编程——机器指令编程 | hez2010</title>
  
  
  
  <!--link rel="stylesheet" href="//cdn.jsdelivr.net/highlight.js/9.10.0/styles/github-gist.min.css"-->
  
<link rel="stylesheet" href="//cdn.jsdelivr.net/highlight.js/9.10.0/styles/github-gist.min.css">

  
<link rel="stylesheet" href="/css/style.css">

<!-- hexo injector head_end start -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css">

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/hexo-math@4.0.0/dist/style.css">
<!-- hexo injector head_end end --><meta name="generator" content="Hexo 5.1.1"></head>

<body>
<div class="Shell">
    <aside class='SideBar'>
    <section class='avatar' style="background-image: url()">
        <div class='av-pic' style="background-image: url(/assets/avatar.jpg)">
        </div>
    </section>
    <section class='menu'>
        <div>hez2010</div>
        
            <div>软件工程导论</div>
        
        <ul>
          
            <a href="/" class="Btn">
              <li>Home</li>
            </a>  
          
            <a href="/archives/" class="Btn">
              <li>Archive</li>
            </a>  
          
        </ul>
    </section>
    <section class="media">
        
            
                <a target="_blank" rel="noopener" href="https://github.com/hez2010">
                    <img src="/assets/github.svg" />
                </a>
            
        
    </section>
</aside>

    <div class="container">
        <div data-pager-shell>
            <div>
  <article class='ContentView'>
    <header class='PageTitle'>
        <h1>硬件编程——机器指令编程</h1>
    </header>

    <section>
      <p>硬件编程——机器指令编程</p>
<p>利用机器指令控制冯诺依曼计算机执行程序。</p>
<p>17364025 贺恩泽</p>
<h1 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h1><ul>
<li>理解冯·诺伊曼计算机的结构</li>
<li>理解机器指令的构成</li>
<li>理解机器指令执行周期</li>
<li>用汇编编写简单程序</li>
</ul>
<h1 id="实验-学习工具"><a href="#实验-学习工具" class="headerlink" title="实验/学习工具"></a>实验/学习工具</h1><p>简单 CPU 仿真工具 Pippin CPUSim</p>
<h2 id="实验环境环境"><a href="#实验环境环境" class="headerlink" title="实验环境环境"></a>实验环境环境</h2><ul>
<li><p>windows 7 或 以下</p>
</li>
<li><p>浏览器 IE 8 或 以下</p>
</li>
<li><p>Java Runtime Environment 1.6（JRE 6.0）或 以下</p>
<h2 id="网址"><a href="#网址" class="headerlink" title="网址"></a>网址</h2></li>
<li><p><a target="_blank" rel="noopener" href="http://www.science.smith.edu/~jcardell/Courses/CSC103/CPUsim/cpusim.html">http://www.science.smith.edu/~jcardell/Courses/CSC103/CPUsim/cpusim.html</a></p>
</li>
</ul>
<p>如果你的设备不符合以上要求，则需要安装虚拟机</p>
<a id="more"></a>
<h1 id="实验步骤"><a href="#实验步骤" class="headerlink" title="实验步骤"></a>实验步骤</h1><h2 id="任务-1：简单程序"><a href="#任务-1：简单程序" class="headerlink" title="任务 1：简单程序"></a>任务 1：简单程序</h2><h3 id="（1）打开网页-The-PIPPIN-User’s-Guide-slides-The-PIPPIN-User’s-Guide-html-，然后输入-Program-1：Add-2-number"><a href="#（1）打开网页-The-PIPPIN-User’s-Guide-slides-The-PIPPIN-User’s-Guide-html-，然后输入-Program-1：Add-2-number" class="headerlink" title="（1）打开网页 [The PIPPIN User’s Guide](slides/The PIPPIN User’s Guide.html) ，然后输入 Program 1：Add 2 number"></a>（1）打开网页 [The PIPPIN User’s Guide](slides/The PIPPIN User’s Guide.html) ，然后输入 Program 1：Add 2 number</h3><p><img src="/assets/barely/1.png" alt="1.png"></p>
<p><img src="/assets/barely/2.png" alt="2.png"></p>
<p>运行：</p>
<p><img src="/assets/barely/3.png" alt="3.png"></p>
<p><img src="/assets/barely/4.png" alt="4.png"></p>
<h3 id="（2）点step-after-step。观察并回答下面问题："><a href="#（2）点step-after-step。观察并回答下面问题：" class="headerlink" title="（2）点step after step。观察并回答下面问题："></a>（2）点step after step。观察并回答下面问题：</h3><ul>
<li><p>PC，IR 寄存器的作用。</p>
<p>PC 为程序计数器，存储下一条指令的地址</p>
<p>IR 为指令寄存器，存储当前执行的指令</p>
</li>
<li><p>ACC 寄存器的全称与作用。</p>
<p>累加器，保存累加计算的结果，通常存储算逻运算的中间结果。</p>
<p>使用累加器可以在 CPU 中缓存常用的数据，这样就不需要每次从内存中读取，例如 <code>for</code> 循环时可以用累加器保存当前的 <code>i</code>，相比缓存和内存速度快很多。</p>
</li>
<li><p>用“LOD #3”指令的执行过程，解释Fetch-Execute周期。</p>
<p>CPU 从 PC 中读取指令地址并读入 IR 寄存器，完成取指阶段。</p>
<p>然后 CPU 对指令进行译码，取出操作码 LOD 和操作数 #3，完成译码阶段</p>
<p>然后 CPU 根据指令码将 #3 读到寄存器中，完成执行阶段。</p>
</li>
<li><p>用“ADD W” 指令的执行过程，解释Fetch-Execute周期。</p>
<p>CPU 从 PC 中读取指令地址并读入 IR 寄存器，完成取指阶段。</p>
<p>然后 CPU 对指令进行译码，取出操作码 ADD 和操作数 W，完成译码阶段</p>
<p>然后 CPU 根据指令码，从地址 W 读入数值，完成访存阶段。</p>
<p>最后，CPU 使 ALU 进行加法运算，完成执行阶段。</p>
</li>
<li><p>“LOD #3” 与 “ADD W” 指令的执行在Fetch-Execute周期级别，有什么不同。</p>
<ol>
<li>取指读入的数据不一样</li>
<li>解码后执行的命令不一样</li>
<li>LOD #3 不涉及内存访问，而 ADD W 则需要从内存中读入 W。</li>
</ol>
</li>
</ul>
<h3 id="（3）点击“Binary”-观察回答下面问题"><a href="#（3）点击“Binary”-观察回答下面问题" class="headerlink" title="（3）点击“Binary”,观察回答下面问题"></a>（3）点击“Binary”,观察回答下面问题</h3><p><img src="/assets/barely/5.png" alt="5.png"></p>
<h4 id="写出指令-“LOD-7”-的二进制形式，按指令结构，解释每部分的含义。"><a href="#写出指令-“LOD-7”-的二进制形式，按指令结构，解释每部分的含义。" class="headerlink" title="写出指令 “LOD #7” 的二进制形式，按指令结构，解释每部分的含义。"></a>写出指令 “LOD #7” 的二进制形式，按指令结构，解释每部分的含义。</h4><p>00010100 00000111</p>
<p>00010100 表示 LOD 指令，00000111 表示操作数，代表立即数 7。</p>
<h4 id="解释-RAM-的地址。"><a href="#解释-RAM-的地址。" class="headerlink" title="解释 RAM 的地址。"></a>解释 RAM 的地址。</h4><p>PIPPIN 的内存空间有256字节，0<del>127存储指令，而128</del>255存储数据。</p>
<p>每一个指令为 2 字节，因此相邻地址相差 2；而数据为 1 字节，因此相邻地址相差 1。</p>
<h4 id="该机器CPU是几位的？（按累加器的位数）"><a href="#该机器CPU是几位的？（按累加器的位数）" class="headerlink" title="该机器CPU是几位的？（按累加器的位数）"></a>该机器CPU是几位的？（按累加器的位数）</h4><p>8 位。</p>
<h4 id="写出该程序对应的-C语言表达。"><a href="#写出该程序对应的-C语言表达。" class="headerlink" title="写出该程序对应的 C语言表达。"></a>写出该程序对应的 C语言表达。</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs c">int_8 W = <span class="hljs-number">3</span>;<br>int_8 X = <span class="hljs-number">7</span>;<br>int_8 Y = W + X;<br></code></pre></td></tr></table></figure>

<h2 id="任务-2：简单循环"><a href="#任务-2：简单循环" class="headerlink" title="任务 2：简单循环"></a>任务 2：简单循环</h2><h3 id="（1）-输入程序Program-2，运行并回答问题："><a href="#（1）-输入程序Program-2，运行并回答问题：" class="headerlink" title="（1） 输入程序Program 2，运行并回答问题："></a>（1） 输入程序Program 2，运行并回答问题：</h3><p><img src="/assets/barely/6.png" alt="6.png"></p>
<p><img src="/assets/barely/7.png" alt="7.png"></p>
<ol>
<li><p>用一句话总结程序的功能</p>
<p>每次将 X 减 1，如果减到 0 则结束，否则将结果写回内存。</p>
</li>
<li><p>写出对应的 c 语言程序</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-keyword">while</span> (X - <span class="hljs-number">1</span> != <span class="hljs-number">0</span>) &#123;<br>    X = X - <span class="hljs-number">1</span>;<br>&#125;<br></code></pre></td></tr></table></figure>

</li>
</ol>
<h3 id="（2）-修改该程序，用机器语言实现-10-9-8-1-，输出结果存放于内存-Y"><a href="#（2）-修改该程序，用机器语言实现-10-9-8-1-，输出结果存放于内存-Y" class="headerlink" title="（2） 修改该程序，用机器语言实现 10+9+8+..1 ，输出结果存放于内存 Y"></a>（2） 修改该程序，用机器语言实现 10+9+8+..1 ，输出结果存放于内存 Y</h3><ol>
<li><p>写出 c 语言的计算过程</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs c">int_8 X = <span class="hljs-number">10</span>;<br>int_8 Y = <span class="hljs-number">0</span>;<br><span class="hljs-keyword">while</span> (X != <span class="hljs-number">0</span>) &#123;<br>    Y = Y + X;<br>    X = X - <span class="hljs-number">1</span>;<br>&#125;<br></code></pre></td></tr></table></figure></li>
<li><p>写出机器语言的计算过程</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs asm">LOD #10<br>STO X<br>LOD #0<br>STO Y<br>LOD X<br>JMZ #24<br>ADD Y<br>STO Y<br>LOD X<br>SUB #1<br>STO X<br>JMP #8<br>HLT<br></code></pre></td></tr></table></figure>

<p><img src="/assets/barely/8.png" alt="8.png"></p>
<p>执行过程：</p>
<p><img src="/assets/barely/9.png" alt="9.png"></p>
<p>结果：</p>
<p><img src="/assets/barely/10.png" alt="10.png"></p>
</li>
<li><p>用自己的语言，简单总结高级语言与机器语言的区别与联系。</p>
<p> 区别：</p>
<ul>
<li><p>机器语言可以被机器直接读取执行，而高级语言需要先编译成机器语言之后才能被机器识别和执行。</p>
</li>
<li><p>机器语言一般与机器有着较强的相关性，是为某一种机器设计的，而高级语言一般具有通用性，由编译器处理不同目标机器上的差异</p>
</li>
<li><p>机器语言由一串二进制组成，不易于编写和理解，而高级语言则更容易让人类理解和编写</p>
<p>联系：</p>
</li>
<li><p>一般来说，编译器会将高级语言编译到机器语言，因此机器语言是高级语言的基础和支撑</p>
</li>
</ul>
</li>
</ol>
<h1 id="实验小结"><a href="#实验小结" class="headerlink" title="实验小结"></a>实验小结</h1><p>通过本次实验，我了解到了机器语言编程的方法，并且加深了对 Fetch-Execute 过程的理解。</p>
<p>CPU 在执行机器指令时，需要经历取指、译码、访存、执行和写回这几个步骤。</p>
<p>另外，我还了解到了高级语言和机器语言之间的关系，高级语言和机器语言通过编译器联系起来，编译器会将高级语言编译成机器语言，然后机器就能识别和执行我们的程序了。</p>
<p>在编写程序的时候，如果采用机器语言，则需要自己处理好每一步的跳转和内存地址的选取等等，这个过程需要理清自己的思路，而且由于机器语言可读性不如高级语言，因此编写的难度也比高级语言高。</p>
<p>总之，本次实验让我学会了机器处理指令和数据的方法，以及机器语言的编程方法，并了解了高级语言和机器语言之间的关系，收获非常大。</p>


      

    </section>
    
      <section class='ArticleMeta'>
          <div>
            发布于&nbsp;
            <time datetime="2020-11-07T10:54:48.681Z" itemprop="datePublished">
              2020-11-07
            </time>
          </div>
          
      </section>
    
    
</article>

  
</div>

            <footer>
    <div>© 2021 - Steven He </div>
    <div>
        <span>
            Powered by <a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a>
        </span>
        ,
        <span>
            Theme - <a target="_blank" rel="noopener" href="https://github.com/nameoverflow/hexo-theme-icalm">Icalm</a>
        </span>
    </div>
</footer>

        </div>
    </div>
</div>

<script src="/js/pager/dist/singlepager.js"></script>

<script>
var sp = new Pager('data-pager-shell')

</script>
</body>
</html>